package com.conductor.shortenurl.strategy;

import com.conductor.shortenurl.util.HashUtil;
import com.conductor.shortenurl.util.ShardingUtil;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;

/**
 * @author fkh
 */
public abstract class CustomShardingAlgorithm {

    /**
     * 计算分片
     * @param preciseShardingValue
     * @return 分片序号
     */
    public long calSlot(PreciseShardingValue<String> preciseShardingValue) {
        /**
         * 分片方法使用的是取模法，即：
         * hashCode % 分片总数 = 分片序号
         * 其中：得到分片序号后按照分片序号取对应的数据库和表来进行数据的读写。
         * 例如：分片序号为16的话则有
         * 16 % 4 = 0，即：16 取模 4 等于 0，所以 16 对应的数据库是 ds0，对应的表是 url_mapping_0。
         */
        long hashCode = HashUtil.base62ToLong(preciseShardingValue.getValue());//十进制
        return Math.abs(hashCode % ShardingUtil.SUM_SLOT);//分片序号
    }

}
